package top.lixunda.ecommerce.server.business.api.entity.dto;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

/**
 * @author LiXunda
 * @version time:2019/10/16 17:04
 * <p>
 * 分页查询数据DTO，用于传递一个分页数据对象和两个条件构造对象
 */
@SuppressWarnings({"WeakerAccess", "unused"})
@ApiModel(value = "分页查询数据DTO", description = "用于传递一个分页数据对象和两个条件构造对象")
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class PageConvertWrapperDTO<E, T, D> {

    /**
     * 分页数据
     */
    @ApiModelProperty("分页数据")
    private Page<D> page;

    /**
     * 用户分页的条件，主数据的条件
     */
    @ApiModelProperty("用户分页的条件，主数据的条件")
    private LambdaQueryWrapper<E> pageWrapper;

    /**
     * 用户对子数据进行筛选的条件
     */
    @ApiModelProperty("用户对子数据进行筛选的条件")
    private LambdaQueryWrapper<T> queryWrapper;

    /**
     * 静态构造方法
     *
     * @param page         分页数据
     * @param pageWrapper  主表查询条件构造器
     * @param queryWrapper 附表查询条件构造器
     * @param <E>          返回数据泛型
     * @param <T>          主表实体类泛型
     * @param <D>          附表实体类泛型
     * @return 分页查询数据DTO
     */
    public static <E, T, D> PageConvertWrapperDTO<E, T, D> build(Page<D> page, LambdaQueryWrapper<E> pageWrapper,
                                                                 LambdaQueryWrapper<T> queryWrapper) {
        return new PageConvertWrapperDTO<E, T, D>().setPage(page).setPageWrapper(pageWrapper).setQueryWrapper(queryWrapper);
    }

    /**
     * 静态构造方法，只包含分页数据
     *
     * @param page 分页数据
     * @param <E>  返回数据泛型
     * @param <T>  主表实体类泛型
     * @param <D>  附表实体类泛型
     * @return 分页查询数据DTO
     */
    public static <E, T, D> PageConvertWrapperDTO<E, T, D> build(Page<D> page) {
        return build(page, null, null);
    }

    /**
     * 静态构造方法，只包含分页数据和主表查询条件构造器数据
     *
     * @param page        分页数据
     * @param pageWrapper 主表查询条件构造器
     * @param <E>         返回数据泛型
     * @param <T>         主表实体类泛型
     * @param <D>         附表实体类泛型
     * @return 分页查询数据DTO
     */
    public static <E, T, D> PageConvertWrapperDTO<E, T, D> build(Page<D> page, LambdaQueryWrapper<E> pageWrapper) {
        return build(page, pageWrapper, null);
    }

}
